热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

哪吒|功能强大_MongoDB数据库1,MongoDB的基本概念与基本数据类型

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MongoDB数据库1,MongoDB的基本概念与基本数据类型相关的知识,希望对你有一定的参考价值。目录

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MongoDB数据库1,MongoDB的基本概念与基本数据类型相关的知识,希望对你有一定的参考价值。



目录


    • 一、文档
    • 二、集合
      • 1、集合
      • 2、集合的命名

    • 三、数据库
    • 四、基本数据类型
      • 1、JSON数据类型
      • 2、MongoDB常见的数据类型
      • 3、ObjectId

    • 五、创建、更新、删除文档
      • 1、$set修饰符入门
      • 2、递增操作和递减操作

    • 六、数组运算符
      • 1、添加元素
      • 2、如果将数组作为集合使用
      • 3、删除元素
      • 4、基于位置的数组更改
      • 5、使用数组过滤器进行更新
      • 6、upsert
      • 7、save辅助函数
      • NoSQL数据库进阶实战
      • 哪吒精品系列文章




一、文档

文档是MongoDB中的基本数据单元,相当于传统关系型数据库中的行,它是一组有序键值的集合。每个文档都有子一个特殊的键“_id”,其在所属的集合中是唯一的。

文档中的键是字符串类型。

键中不能含有\\0(空字符)。这个字符用于表示一个键的结束。
.和$是特殊字符,只能在某些特定情况下使用。通常情况下,可以认为这两个字符是MongoDB的保留字符,如果使用不当,那么驱动程序将无法正常工作。


二、集合


1、集合

集合就是一组文档。可以看做是具有动态模式的表。

集合具有动态模式的特性。这意味着一个集合中的文档可以具有任意数量的不同形态。

但是,将不同类型的文档存放在一个集合中会出现很多问题:


  1. 文档中可以存放任意类型的变量,但是,这里不建议将不同类型的文档保存在同一个集合中,开发人员需要确保每个查询只返回特定模式的文档,或者确保执行查询的应用程序代码可以处理不同类型的文档;
  2. 获取集合列表比提取集合中的文档类型列表要快得多,减少磁盘查找次数;
  3. 想相同类型的文档存放在同一个集合中可以实现数据的局部性,对于集合,让使用者见文知意;
  4. 集合中只存放单一类型的文档,可以更高效地对集合进行索引;

2、集合的命名


  1. 集合名称中不能是空字符串;
  2. 集合名称不能包含\\0(空字符),因为这个字符用于表示一个集合名称的结束;
  3. 集合名称不能以system.开头,该前缀是为内部集合保留的。
  4. 集合名称不能有$,只能在某些特定情况下使用。通常情况下,可以认为这两个字符是MongoDB的保留字符,如果使用不当,那么驱动程序将无法正常工作。

三、数据库

MongoDB使用集合对文档进行分组,使用数据库对集合进行分组。通常情况下,一个应用程序对应一个数据库,一个数据库包含多个集合,一个集合包含多个文档。


四、基本数据类型


1、JSON数据类型

MongoDB中的文档可以被认为是“类似于JSON”的形式,JSON是一种简单的数据表示形式,只有6种数据类型


  1. null
  2. 布尔
  3. 数字
  4. 字符串
  5. 数组
  6. 对象

2、MongoDB常见的数据类型

MongoDB在保留了JSON基本键值对特性的基础上,增加了许多额外的数据类型,最常见的如下:


  1. null
  2. 布尔
  3. 数字
  4. 字符串
  5. 数组
  6. 日期
  7. 正则表达式
  8. 内嵌文档
  9. ObjectId,ObjectId是一个12字节的ID,是文档的唯一标识,也就是_id

3、ObjectId

ObjectId是“_id”的默认类型。ObjectId类采用了轻量化设计,可以很容易地在不同的机器上以全局唯一的方式生成。MongoDB的分布式特性是它使用ObjectId而不是使用自增主键的主要原因,跨多个服务器同步自增主键既困难又耗时。因为MongoDB的设计初衷就是作为一个分布式数据库,所以能够在分片环境中生成唯一的标识符非常重要。

ObjectId占用了12字节的存储空间,可以用24个十六进制数字组成的字符串来表示,每字节存储两个数字。

ObjectId的12字节是按照如下方式生成的:

ObjectId的前4个字节是从Unix纪元开始以秒为单位的时间戳。时间戳与随后的5个字节组合在一起,在秒级别的粒度上提供了唯一性。

MongoDB自带一个简单但功能强大的工具:mongo shell。mongo shell对管理MongoDB实例和使用MongoDB的查询语言操作数据提供了内置的支持。它也是一个功能齐全的Javascript解释器,用户可以根据需求创建或加载自己的脚本。


五、创建、更新、删除文档


1、$set修饰符入门

$set用来设置一个字段的值。如果这个字段不存在,则创建该字段。

对于更新操作或添加操作非常方便。

$unset表示删除这个键。


2、递增操作和递减操作

$inc运算符可以用来修饰已存在的键值或者在该键不存在时创建它。对于更新分析数据、因果关系、投票或者其他有数值变化的地方,使用这个会非常方便。


六、数组运算符

数组是常见的功能强大的数据结构,它不仅可以通过索引进行引用的列表,而且可以作为集合来使用。


1、添加元素

如果数组已存在,$push就会将元素添加到数组末尾;如果数组不存在,则会创建一个新的数组。可以对$push使用$each修饰符,再一次操作中添加多个值。

> db.nezha.updateOne("id":"1","$push":"job":[1,2,3])
"acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1
> db.nezha.find()
"_id" : ObjectId("638b1273bb535f1c23f9b096"), "id" : "1", "name" : "哪吒编程", "job" : [ [ 1, 2, 3 ] ]
>

再次updateOne时,还是会增加:

> db.nezha.updateOne("id":"1","$push":"job":[1,2,3])
"acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1
> db.nezha.find()
"_id" : ObjectId("638b1273bb535f1c23f9b096"), "id" : "1", "name" : "哪吒编程", "job" : [ [ 1, 2, 3 ], [ 1, 2, 3 ] ]
>

2、如果将数组作为集合使用

仅当一个值不存在时菜进行添加,可以在查询文档的时候使用``“$ne”```来实现:

> db.nezha.updateOne("id":"$ne":"1","$push":"job":[1,2,3])
"acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0
> db.nezha.find()
"_id" : ObjectId("638b1273bb535f1c23f9b096"), "id" : "1", "name" : "哪吒编程", "job" : [ [ 1, 2, 3 ], [ 1, 2, 3 ] ]

也可以使用"$addToSet"来避免插入重复的值,还可以通过"$addToSet"$each结合使用,添加多个不同的值。

> db.nezha.updateOne("id":"1","$addToSet":"address":"辽宁省大连市高新园区"))
"acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0
> db.nezha.find() 园区")
"_id" : ObjectId("638b1273bb535f1c23f9b096"), "id" : "1", "name" : "哪吒编程", "job" : [ [ 1, 2, 3 ], [ 1, 2, 3 ] ], "address" : [ "辽宁省大连市高新园区"]

3、删除元素

有多种方法可以从数组中删除元素。

如果将数组视为队列或者栈,那么可以使用"$pop"从任意一端删除元素。

> db.workers.insert(id:'1',name:['哪吒编程','云韵','萧炎'])
WriteResult( "nInserted" : 1 )
> db.workers.find()
"_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒编程", "云韵", "萧炎" ]
>

萧炎实在是太碍事了,删掉他。

> db.workers.find()
"_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒编程", "云韵", "萧炎" ]
> db.workers.updateOne(,"$pull":"name":"萧炎")
"acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1
> db.workers.find()
"_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒编程", "云韵" ]

4、基于位置的数组更改

修改数组中特定的值,可以按位置或使用定位运算符$。

> db.users.insert(id:'1',dept:[
... "name":"哪吒编程","age":18,"address":"大连",
... "name":"云韵","age":19,"address":"大连",
... "name":"萧炎","age":28,"address":"北京"])
WriteResult( "nInserted" : 1 )
> db.users.find() ss":"北京"])
"_id" : ObjectId("638b2605bb535f1c23f9b099"), "id" : "1", "dept" : [ "name" : "哪吒编程", "age" : 18, "address" : "大连" , "name" : "云韵", "age" : 19, "address" : "大连" , "name" : "萧炎", "age" : 28, "address" : "北京" ]
>

想要将文档中的萧炎修改为美杜莎,怎么修改呢?

> db.users.updateOne("dept.name":"萧炎","$set":"dept.$.name":"美杜莎")
"acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1
> db.users.find() ")
"_id" : ObjectId("638b2822bb535f1c23f9b09a"), "id" : "1", "dept" : [ "name" : "哪吒编程", "age" : 18, "address" : "大连" , "name" : "云韵", "age" : 19, "address" : "大连" , "name" : "美杜莎", "age" : 28, "address" : "北京" ]
>

5、使用数组过滤器进行更新

MongoDB 3.6 引入了用于更新单个数组元素的选项:arrayFilters。此选项使我们能够修改特定条件匹配的数组元素。


6、upsert

upsert是一种特殊类型的更新,如果找不到与筛选条件相匹配的文档,则会以这个条件和更新文档为基础来创建一个新文档;如果找到了匹配的文档,则进行正常的更新。upsert用起来非常方便,有了它便不再需要创建集合,通常可以使用同一套代码创建和更新文档。


7、save辅助函数

save是一个shell函数,它可以在文档不存在时插入文档,在文档存在时更新文档。它只将一个文档作为其唯一的参数。如果文档中包含"_id"键,save就会执行一个upsert。否则,将执行插入操作。save实际上只是一个为了方便而使用的函数。




NoSQL数据库进阶实战

NoSQL数据库进阶实战1,那些年学过的NoSQL基础

NoSQL数据库进阶实战2,NoSQL数据存储模式

Redis缓存穿透、击穿、雪崩到底是个啥?7张图告诉你

Redis分布式锁的实现方式

Redis分布式缓存、秒杀

基于Stream的Redis消息队列


哪吒精品系列文章

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

Java高并发编程系列

数据库进阶实战系列


推荐阅读
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Linux基础知识:Vi与Vim编辑器详解
    Linux基础知识:Vi与Vim编辑器详解 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
  • Shell参数详解与应用
    本文详细介绍了Shell参数的种类及其应用,内容简洁明了,结构清晰。通过深入解析各类参数的功能和使用方法,旨在帮助读者更好地理解和掌握Shell编程技巧,提升实际操作能力。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
author-avatar
小菜鸟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有